/**
 * 请求工具类型定义
 */

/**
 * 请求配置
 */
export type UniRequestConfig = Omit<UniApp.RequestOptions, "header" | "success" | "fail" | "complete"> & {
    /** 请求基础URL */
    baseURL?: string;
    /** 请求数据 */
    data?: Record<string, any>
    /** URL参数 */
    params?: Record<string, any>
    /** 请求头 */
    headers?: Record<string, string>
};

/**
 * 用户请求配置
 */
export type UniRequestUserConfig = Omit<UniRequestConfig, "url">;

export type UniRequestInternalConfig = UniRequestConfig & {
    headers: Record<string, string>
}

/**
 * 响应数据接口
 */
export interface UniResponse<T = any> {
    /** 响应数据 */
    data: T
    /** HTTP状态码 */
    statusCode: number
    /** 响应头信息 */
    header: Record<string, string>
    /** cookies */
    cookies?: string[]
}

/**
 * 请求错误接口
 */
export interface UniRequestError extends Error {
    /** 错误配置 */
    config: UniRequestConfig
    /** 错误码 */
    code?: string | number
    /** 请求对象 */
    request?: any
    /** 响应对象 */
    response?: UniResponse
}

/**
 * 拦截器处理函数类型
 */
export type InterceptorFulfilled<T, R = any> = (value: T) => R | Promise<R>
export type InterceptorRejected = (error: any) => any

/**
 * 拦截器项
 */
export interface InterceptorItem<T> {
    fulfilled?: InterceptorFulfilled<T>
    rejected?: InterceptorRejected
}

/**
 * 拦截器管理器接口
 */
export interface InterceptorManager<T> {
    /** 使用拦截器 */
    use(fulfilled?: InterceptorFulfilled<T>, rejected?: InterceptorRejected): number

    /** 移除拦截器 */
    eject(id: number): void

    /** 清空拦截器 */
    clear(): void
}

/**
 * 上传进度信息
 */
export interface UploadProgress {
    /** 上传进度百分比 */
    progress: number
    /** 已上传的数据长度 */
    totalBytesSent: number
    /** 预期需要上传的数据总长度 */
    totalBytesExpectedToSend: number
}

/**
 * 下载进度信息
 */
export interface DownloadProgress {
    /** 下载进度百分比 */
    progress: number
    /** 已下载的数据长度 */
    totalBytesWritten: number
    /** 预期需要下载的数据总长度 */
    totalBytesExpectedToWrite: number
}

/**
 * 上传文件配置
 */
export interface UploadConfig extends Omit<UniRequestConfig, 'method' | 'data'> {
    /** 文件路径 */
    filePath: string
    /** 文件对应的 key */
    name: string
    /** HTTP 请求中其他额外的 form data */
    formData?: Record<string, any>
    /** 上传进度回调 */
    onProgress?: (progress: UploadProgress) => void
}

/**
 * 下载文件配置
 */
export interface DownloadConfig extends Omit<UniRequestConfig, 'method' | 'data'> {
    /** 下载后存储的文件路径 */
    filePath?: string
    /** 下载进度回调 */
    onProgress?: (progress: DownloadProgress) => void
}

/**
 * 上传文件响应
 */
export interface UploadResponse {
    /** 响应数据 */
    data: string
    /** HTTP状态码 */
    statusCode: number
}

/**
 * 下载文件响应
 */
export interface DownloadResponse {
    /** 临时文件路径 */
    tempFilePath: string
    /** HTTP状态码 */
    statusCode: number
}

/**
 * UniRequest 实例接口
 */
export interface UniRequestInstance {
    /** 请求拦截器 */
    interceptors: {
        request: InterceptorManager<UniRequestInternalConfig>
        response: InterceptorManager<UniResponse>
    }

    /** 发起请求 */
    request<T = any>(config: UniRequestConfig): Promise<UniResponse<T>>

    /** GET 请求 */
    get<T = any>(url: string, config?: UniRequestUserConfig): Promise<UniResponse<T>>

    /** POST 请求 */
    post<T = any>(url: string, data?: any, config?: UniRequestUserConfig): Promise<UniResponse<T>>

    /** PUT 请求 */
    put<T = any>(url: string, data?: any, config?: UniRequestUserConfig): Promise<UniResponse<T>>

    /** DELETE 请求 */
    delete<T = any>(url: string, config?: UniRequestUserConfig): Promise<UniResponse<T>>

    /** HEAD 请求 */
    head<T = any>(url: string, config?: UniRequestUserConfig): Promise<UniResponse<T>>

    /** OPTIONS 请求 */
    options<T = any>(url: string, config?: UniRequestUserConfig): Promise<UniResponse<T>>

    /** 上传文件 */
    upload(config: UploadConfig): Promise<UploadResponse>

    /** 下载文件 */
    download(config: DownloadConfig): Promise<DownloadResponse>
} 